package org.jsola.hr.common.task;

import lombok.extern.slf4j.Slf4j;
import org.jsola.common.DateKit8;
import org.jsola.hr.constant.HrConstants;
import org.jsola.hr.dto.TaskAddDTO;
import org.jsola.hr.entity.TaskDO;
import org.jsola.hr.query.TaskQuery;
import org.jsola.hr.service.ITaskService;
import org.jsola.hr.vo.TaskListVO;
import org.jsola.hr.vo.TaskVO;
import org.jsola.notice.constant.NoticeConstants;
import org.jsola.user.core.TokenUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 定时任务工具类(提供示例,不能直接调用,因为每个定时任务的逻辑处理不一样,需要自己写业务层)
 *
 * @author wcl
 */

@Slf4j
@Component("hrTaskKit")
public class TaskKit {

    @Autowired
    private ITaskService taskService;

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTask;

    /**
     * 添加定时任务记录
     *
     * @param taskAddDTO 人力定时任务添加对象
     * @param tokenUser  当前用户
     */
    public void addTask(TaskAddDTO taskAddDTO, TokenUser tokenUser) {
        // 添加记录,重试系统时加载
        Date runDate = taskAddDTO.getRunDate();
        // 运行时间早于当前时间,用当前时间的下一分钟
        if (runDate == null || runDate.before(new Date())) {
            runDate = DateKit8.addMinutes(new Date(), 1);
        }
        taskAddDTO.setRunDate(runDate);
        taskAddDTO.setStatus(false);
        // 写入定时任务表
        TaskVO taskVO = taskService.saveNoticeTask(taskAddDTO, tokenUser);
        if (taskVO == null) {
            return;
        }
        // 添加运行定时任务
        Runnable runnable = new TaskService(taskVO.getId());
        threadPoolTask.schedule(runnable,runDate);
    }

    /**
     * 添加定时任务记录
     *
     * @param taskAddDTOList 人力定时任务添加对象
     * @param tokenUser      当前用户
     */
    public void addTaskList(List<TaskAddDTO> taskAddDTOList, TokenUser tokenUser) {
        for (TaskAddDTO taskAddDTO : taskAddDTOList) {
            addTask(taskAddDTO, tokenUser);
        }
    }

    public class TaskService implements Runnable {

        private String taskId;

        TaskService(String taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            // 查询不需要siteId
            TaskDO task = taskService.selectDOById(taskId, HrConstants.DEFAULT);
            if (Objects.nonNull(task)) {
                // 发送通知定时任务
                taskService.runNoticeTask(taskId);
            }
        }
    }
}